package ar.com.age.distribuidora.service.impl;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;

import ar.com.age.distribuidora.dao.AdministradorDao;
import ar.com.age.distribuidora.dao.EmpleadoDao;
import ar.com.age.distribuidora.dao.GerenteDao;
import ar.com.age.distribuidora.dominio.Administrador;
import ar.com.age.distribuidora.dominio.Empleado;
import ar.com.age.distribuidora.dominio.Gerente;
import ar.com.age.distribuidora.dominio.Usuario;
import ar.com.age.distribuidora.service.UsuarioService;

public class UsuarioServiceImpl implements UsuarioService {

	private GerenteDao gerenteDao;
	
	private AdministradorDao administradorDao;
	
	private EmpleadoDao empleadoDao;
	
	@Autowired(required = true)
	public void setGerenteDao(GerenteDao gerenteDao) {
		this.gerenteDao = gerenteDao;
	}
	
	@Autowired(required = true)
	public void setAdministradorDao(AdministradorDao administradorDao) {
		this.administradorDao = administradorDao;
	}
	
	@Autowired(required = true)
	public void setEmpleadoDao(EmpleadoDao empleadoDao) {
		this.empleadoDao = empleadoDao;
	}
	
	// Servicios de la interfaz UsuarioDao
	@Override
	public Object autenticarAdministrador(String codigo, String contrasenia) {
		
		return administradorDao.authenticate(codigo, contrasenia);		
	}
	
	@Override
	public void eliminarAdministrador(Usuario usuario) {
		
		administradorDao.physicalDelete(usuario);		
	}
	
	@Override
	public Object autenticarEmpleado(String codigo, String contrasenia) {
		
		return empleadoDao.authenticate(codigo, contrasenia);		
	}
	
	@Override
	public void eliminarEmpleado(Usuario usuario) {
		
		empleadoDao.physicalDelete(usuario);		
	}
	
	@Override
	public Object autenticarGerente(String codigo, String contrasenia) {
		
		return gerenteDao.authenticate(codigo, contrasenia);		
	}
	
	@Override
	public void eliminarGerente(Usuario usuario) {
		
		gerenteDao.physicalDelete(usuario);		
	}
		
	
	// Servicios de Administrador
	@Override
	public void crearOEditarAdministrador(Administrador administrador) {
		
		administradorDao.saveOrUpdate(administrador);		
	}

	@Override
	public List<Administrador> buscarTodosAdministrador() {

		return administradorDao.getAll();
	}
	
	@Override
	public List<Administrador> buscarAdministrador(String codigo, String apellido, String nombre, String estado) {

		return administradorDao.find(codigo, apellido, nombre, estado);
	}
	
	// Servicios de Empleado
	@Override
	public void crearOEditarEmpleado(Empleado empleado) {

		empleadoDao.saveOrUpdate(empleado);		
	}

	@Override
	public List<Empleado> buscarTodosEmpleado() {

		return empleadoDao.getAll();
	}

	@Override
	public List<Empleado> buscarEmpleado(String codigo, String apellido, String nombre, String estado, String tipo) {

		return empleadoDao.find(codigo, apellido, nombre, estado, tipo);
	}

	// Servicios de Gerente
	@Override
	public void crearOEditarGerente(Gerente gerente) {

		gerenteDao.saveOrUpdate(gerente);		
	}

	@Override
	public List<Gerente> buscarTodosGerente() {

		return gerenteDao.getAll();
	}

	@Override
	public List<Gerente> buscarGerente(String codigo, String apellido, String nombre, String estado) {

		return gerenteDao.find(codigo, apellido, nombre, estado);
	}

	// Login... El login se realiza con las variables Codigo y Contrasenia
	@Override
	public Object realizarLogin(String codigo, String contrasenia) {
		
		if(this.autenticarAdministrador(codigo, contrasenia) != null)
			return (Administrador)this.autenticarAdministrador(codigo, contrasenia);
		
		if(this.autenticarEmpleado(codigo, contrasenia) != null)
			return (Empleado)this.autenticarEmpleado(codigo, contrasenia);
		
		if(this.autenticarGerente(codigo, contrasenia) != null)
			return (Gerente)this.autenticarGerente(codigo, contrasenia);
		
		// Si no existe el usuario retorna un objeto nulo... 
		return null;
	}
}
